library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;


entity fc_meten is
	port( 
		reed : in std_logic := '1';
		clk	: in std_logic;
		rst : in std_logic;
		deltat : out std_logic_vector(63 downto 0);
		deltat_strobe : out std_logic;
		time_out : out std_logic
	);
end entity fc_meten;

architecture v of fc_meten is
	signal debounce_timer : natural range 0 to 30;
	signal timer		: natural range 0 to 75001;
	signal reed_sync : std_logic_vector (1 downto 0);
	signal edge_detected : std_logic;
begin
	
	process(rst, clk)
		
		begin 
			if rst = '1' then -- alles op 0 zetten bij een reset
				deltat <= (others => '0'); -- waarde van het aantal klokpulsen van een omwenteling 
				deltat_strobe <= '0'; -- gaaft aan dat er een nieuwe waarde is (een klokslag)
				time_out <= '0'; -- geen signiaal langer dan 75000ms (een klokslag)
				reed_sync <= (others => '0'); -- reed signiaal voor dubbele sync
				debounce_timer <= 0; -- teller voor het filteren van contactdender
				timer <= 0; -- timer op 0
				edge_detected <= '0';
			elsif rising_edge(clk) then -- bij een opgaande flank reedcontact dubbel synchroniseren
				reed_sync(1) <= reed_sync(0);
				reed_sync(0) <= not(reed);				
				
				-- default 0			
				deltat_strobe <= '0';
				time_out <= '0';

				timer <= timer + 1;
				
				-- Check for falling edge (rising edge in original signal)
				if reed_sync(0) = '0' and reed_sync(1) = '1' then
					edge_detected <= '1';
				else
					if edge_detected = '1' then
						-- Count to 30 (3 ms) and check the signal again
						if debounce_timer < 30 then
							if reed_sync(1) = '0' then
								debounce_timer <= debounce_timer + 1;
							else
								debounce_timer <= 0;
								edge_detected <= '0';
							end if;
						else							
							if reed_sync(1) = '0' then
								-- A real falling edge								
								if new_deltat > 401 then 
									deltat <= std_logic_vector(to_unsigned(timer, deltat'length));
									deltat_strobe <= '1';
								end if;
								
								timer <= 0;
							end if;
							
							debounce_timer <= 0;
							edge_detected <= '0';
						end if;
					end if;
				end if;
				
				if timer >= 75000 then -- -- maar wanneer timer groter wordt dan 75000 (maximale omwenteltijd)
					time_out <= '1'; -- time_out wordt 1 (en bij een nieuwe klokpuls 0, zie top)
					timer <= 0; -- timer wordt gereset
				end if;
			end if;
			   		
	end process;
end architecture v;
	
